package cn.quevo.ucenter.core;

import java.util.Base64;
import java.util.Set;
import java.util.StringTokenizer;

import cn.quevo.core.enums.EnumsInterface;
import cn.quevo.core.enums.ResultStatusEnum;
import cn.quevo.core.lang.StringUtils;
import cn.quevo.ucenter.core.enums.OauthResultStatusEnum;
import cn.quevo.ucenter.core.exception.OauthException;

public class OAuthUtil {

    /**
     * 构造一个OAuth异常
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:05:13
     * @param enums
     * @return
     */
    public static OauthException handleOauthException(EnumsInterface enums) {
        return new OauthException(enums);
    }

    /**
     * 请求类型错误异常
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:09:02
     * @param expectedContentType
     * @return
     */
    public static OauthException handleBadContentTypeException(String expectedContentType) {
        return new OauthException(OauthResultStatusEnum.CONTENT_TYPE_INVALID);
    }

    /**
     * 必要请求参数不存在异常
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:11:04
     * @param missingParameters
     * @return
     */
    public static OauthException handleMissingParameters(Set<String> missingParams) {
        return new OauthException(ResultStatusEnum.PARAMS_INCOMPLETE,missingParams);
    }

    /**
     * 验证请求类型
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:09:21
     * @param requestContentType
     * @param requiredContentType
     * @return
     */
    public static boolean hasContentType(String requestContentType, String requiredContentType) {
        if (StringUtils.isBlank(requiredContentType) || StringUtils.isBlank(requestContentType)) {
            return false;
        }
        StringTokenizer tokenizer = new StringTokenizer(requestContentType, ";");
        while (tokenizer.hasMoreTokens()) {
            if (requiredContentType.equals(tokenizer.nextToken())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 验证参数是否为空
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:18:32
     * @param dependentParams
     * @return
     */
    public static boolean hasEmptyValues(String[] dependentParams) {
        if (dependentParams == null || dependentParams.length == 0) {
            return true;
        }
        for (String s : dependentParams) {
            if (StringUtils.isBlank(s)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 出现不允许提交的参数
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:28:36
     * @param notAllowedParameters
     * @return
     */
    public static OauthException handleNotAllowedParametersOauthException(Set<String> notAllowedParameters) {
        return new OauthException(ResultStatusEnum.ILLEGAL_PARAMS, notAllowedParameters);
    }

    /**
     * 解码客户端权限头信息
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月26日 下午2:15:23
     * @param clientAuthHeader
     * @return
     */
    public static String[] decodeClientAuthenticationHeader(String clientAuthHeader) {
        if (StringUtils.isBlank(clientAuthHeader)) {
            return null;
        }
        String[] tokens = clientAuthHeader.split(" ");
        if (tokens.length != 2) {
            return null;
        }
        String authType = tokens[0];
        if (!"basic".equalsIgnoreCase(authType)) {
            return null;
        }
        String encodedCreds = tokens[1];
        return decodeBase64EncodedCredentials(encodedCreds);
    }

    /**
     * 编码客户端权限头信息
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月26日 下午2:16:49
     * @param encodedCreds
     * @return
     */
    private static String[] decodeBase64EncodedCredentials(String encodedCreds) {
        String decodedCreds = new String(Base64.getDecoder().decode(encodedCreds));
        String[] creds = decodedCreds.split(":", 2);
        if (creds.length != 2) {
            return null;
        }
        if (!StringUtils.isBlank(creds[0]) && !StringUtils.isBlank(creds[1])) {
            return creds;
        }
        return null;
    }

    /**
     * 用户不存在异常
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:09:02
     * @param expectedContentType
     * @return
     */
    public static OauthException handleUserNotExistsException() {
        return new OauthException(ResultStatusEnum.ACCOUNT_PASSWORD_ERROR);
    }

    /**
     * 用户验证异常
     * 
     * @author July july_sky@foxmail.com
     * @date 2017年12月25日 下午7:09:02
     * @param expectedContentType
     * @return
     */
    public static OauthException handleUserNotExistsException(ResultStatusEnum enums) {
        return new OauthException(enums);
    }
}
